返回文章列表

FlyA 设计哲学

说明

FlyA 设计哲学

状态:draft · 更新:2026-04-25


引子:麻将 AI 的两条主流路径

麻将 AI 在学界与工业界长期存在两条主流思路。

第一条是反事实遗憾最小化路径。它把麻将当成一个不完全信息博弈,在决策树上用反事实遗憾(Counterfactual Regret)这种数学工具长期逼近纳什均衡。CFR 家族是这一路径的起点,它在小规模不完全信息游戏上有严格的收敛保证;DeepCFR 进一步把价值网络和遗憾网络嵌进来,扩展到更大规模的游戏。ACH(Actor Critic with Hindsight)是这个家族里更工程友好的一支——它不依赖重搜索,把反事实遗憾重写成一类可以被 actor-critic 结构直接训练的目标,天然更适合复现。代表性产品是腾讯的 LuckyJ 麻将 AI。

第二条是基于对局结果对决策加权的强化路径。它不追求数学意义上的均衡,而是让神经网络从海量人类牌谱开始学习,并用"这一局最终顺位 / 点差"作为回溯信号,把终局的优劣分摊回过程中的每一步决策。代表性开源项目包括 Mortal、Kanachan、Suphx 等。它们具体做法不一——有的用可学习的终局顺位预测器把未来名次反算成一条逐步的奖励流,有的直接在多阶段训练里拟合"本局点差 / 本局段位变动"——但本质都是用对局结果去加权决策

FlyA 两条都没有完全走。它选择的是更克制、也更有耐心的第三条路

一、为什么没有走反事实遗憾最小化

这不是因为它不可行。事实上,像 ACH 这样的路线并不特别依赖巨大算力,我们内部也验证过它在麻将上可以跑起来。我们没有把主力放在这条路上,原因更多是气质层面的。

  • 前期进步极其缓慢。反事实遗憾类路径的学习曲线,和基于对局结果的强化比起来,初期要平坦得多——模型需要在相似上下文里反复比较不同选择的长期优劣,才能形成稳定的判断。这个耐心周期相当长,想看到明显进步往往需要远超直觉的训练时长
  • 风格容易固化。反事实遗憾类路径的理论上限并不低——它天然倾向于抹平运气方差、避免策略坍缩到单一风格的局部最优,这一点恰好是纯结果导向自对弈容易栽的地方。但在工程实践里一旦训到稳态,策略的风格面会变得很窄,缺乏对不同局势、不同对手的姿态差异
  • 面对弱对手反而过度保守。正因为它是朝着"面对最坏对手也不吃亏"的方向收敛的,遇到水平不及自己的对手时,它不会主动利用对手的弱点,反而会展现出一种偏保守的稳态

这些不是"技术上做不到",而是这条路径的气质和我们希望模型最终长成的样子不完全一致。并不否定它的价值——它理论上的天花板确实高于纯粹基于结果的自对弈强化——但纯粹的反事实遗憾路径最终会把模型固定在一个安全但狭窄的姿态里,这不是我们要的。

二、也不走纯粹的"结果加权"强化

“第二条路"看上去更温和,也更容易复现。它有一个共同的假设:这一局最终赢了,我们一路做的决定就至少平均意义上是好的;这一局输了,那些决定至少平均意义上是坏的。所以用顺位、点差、甚至 learned 的期望顺位,去给过程里的每一步加权,是自然的一步。

但这套逻辑有几个长期问题。

  • 信号极其嘈杂。终局顺位和点差,和单一手决策的质量之间,隔了几十手对手动作、几十次摸牌、几次庄连风向变化。用这么噪的信号去反推一手的好坏,神经网络很容易把一些本来无关的特征抓出来当"成功原因”
  • 它会诱导投机。当训练目标里写着"能让自己这局拿更高期望 pt 的决策更好",模型就会开始追求那些对结果指标直接有利、但在更长时间尺度上并不健康的策略:短期追分、押注型立直、在边界局面过度进攻
  • 它压住了更深层的动机。真正的高水平打法里,很多决策的意义不是"让这局赢"而是"让这一类局面里的动机表达得更合理"。以结果为唯一导向的加权会把这种"动机层"压扁——模型会学会打得像人,却学不到人为什么这样打

FlyA 的判断是:结果导向的加权在前几年确实把开源麻将 AI 的水位推上去了,但它天花板也比想象中低。再往上走,需要另一种训练姿态。

三、第三条路:离线阶段——纯行为学习 + 隐式塑形

FlyA 离线基座的核心立场可以被概括成一句话:

让模型从人类牌谱里诚实地学习行为,同时用辅助判断和后见事实记账把"该怎么思考"悄悄压进表征里,但不在离线阶段做任何显式的结果导向加权。

具体展开,这意味着三件事的组合。

3.1 主策略只学"人类这一手打什么"

离线阶段的主策略头只做一件事:交叉熵拟合真实牌谱里的人类动作。它不看这一手的终局收益,不看顺位,不看点差,不看任何形式的回溯价值信号。这一层只负责一个问题——在这种局面下,真正的好手会打什么

这个看起来"退回去"的决定其实很关键。把离线主策略约束在纯行为学习上,相当于主动放弃了用噪声信号去塑造动作的诱惑。基座不会被"这一局最后怎么收场"这件事污染。

3.2 世界需要被完整地喂给模型,而不是被预消化

一个模型在决策前,应该能够直接看见规则允许它看的所有事实:每张牌还剩几张、当前能否立直、当前是否处于振听、立直后是否被锁摸切、不同和牌路线的距离、各种时点性规则是否生效……这些都是规则本身就能直接回答的事情。

FlyA 把这一层事实组织成一个统一的输入层(内部称为 RO,Rule Oracle)喂进模型。它的设计姿态很明确:

  • 只提供事实,不提供价值预判。它不会告诉模型"这张牌值不值得打",只告诉模型"打这张牌在规则上允许/不允许,以及与规则直接相关的各种标记"
  • 尽可能消除"需要模型重新发现的信息"。哪些牌已经从自家视角消失、振听状态、立直后的动作空间收缩等等,这些都是规则一看就知道的事,没必要让模型自己从上下文里猜
  • 所有价值判断都留给神经网络自己做

这和一些开源系统的选择方向是相反的。业内有一类常见做法是把某种单人 EV 预计算表(如各路线的进张 / 期望点 / 听牌步数)也作为输入特征直接喂给模型——这等于把一部分价值预判提前烤进输入。FlyA 选择不走这条路。原因不是"这些表不准",而是任何形式的预消化价值都会在训练中悄悄成为天花板:模型越依赖预消化信号,就越少真正理解牌局的结构。我们宁愿模型多学两年,也不想在它开始理解之前先给它一副拐杖。

3.3 辅助头与 CHR:压进表征,不压进动作

光靠纯行为克隆,模型学到的是"像人一样打"。要让它有机会"打得比人更好",需要在表征层面多做一件事——让它学会思考人类打麻将时该思考的那些维度,但又不通过结果奖励去做这件事

FlyA 的两个核心机制承担这件事:

  • 辅助头:模型在预测主策略的同时,还被要求去预测一组与麻将有关的事实性判断——对手是否听牌、自家未来几巡的路线走向、一手的近程风险、终局名次概率等等。这些判断只在训练期作为辅助损失存在,从不参与推理时的动作选择。它们的作用是告诉模型:“这些是打麻将该关心的维度。”
  • CHR(Contextual Hindsight Regret):一个基于上下文的后见事实遗憾值记账系统。它把训练数据里每一个决策按"决策族 × 上下文 × 意图"归档,在类似情境里长期累计其后见事实结果,形成一种克制的遗憾值标尺;然后这个标尺再通过共享表征悄悄塑形模型的价值判断

注意这两者都不构成显式的结果加权。辅助头只是让共享骨干承担更多任务,它的梯度流不会变成"某一手应该被偏爱或被惩罚"的信号。CHR 的记账也不是奖励——它形成的是一种"在相似语境下通常留下多少遗憾"的内部先验,最终主要是改变模型怎么看待一类局面,而不是给一手加分减分。

这就是"隐式塑形"的含义:训练信号完全不碰"这手好不好",但模型内部会因为它承担了更多事实性任务,而自己长出对局面更深的理解结构

四、CHR:基于上下文的后见事实记账

辅助头负责"告诉模型该想什么",CHR 负责更难的一层——让神经网络像人一样积累经验,但以它自己能消化的方式,而且不动摇"主策略只学人类动作"这条底线

人类棋手复盘时,大致会做三件事:识别当时的意图,把局面归进某一类熟悉的场景,回忆这一类场景 + 这一类意图在过去通常走向什么结果。CHR 是这件事的神经网络化表达:它让模型把自己的决策按"决策族 × 上下文 × 潜在意图"归档,用已经发生的后见事实(近程风险结算、手牌进展、终局顺位与分差等)长期记账,并从中沉淀出一条克制的遗憾值标尺

这套系统有几个关键立场,它们共同决定了 CHR 不是一个变相的 V 函数、也不是一个隐藏的奖励塑形器。

  • 记的是后见事实,不是学习得到的 Q 值。账本里的每一格,存放的都是那类情境下真实发生过什么,不是模型预测的"应该发生什么"
  • 意图维度是发现出来的,不是指定的。模型在训练中自己决定要把动作按哪些潜在动机分组,这些意图的语义(例如整理、推进、防守、兑现、提速等倾向)是在训练结束后通过回放大量实战局面,从模型行为中读出来的,而不是训练前写死的
  • 决策族与意图槽正交。同一个"意图槽"在不同决策族下的语义并不相同——比如某一个槽在出牌场景和副露场景下对应的动机完全不同。这让 CHR 天然避开了"把动作本身的语义和做动作时的心态混在一起"这个陷阱
  • 账本带置信度。一个格子里样本足够多时,它的后见事实平均结果才被当作数据;样本不足时会回退到更宽的先验,回退强度随样本数平滑变化。这是对神经网络过度外推的一个刻意纠偏
  • 它不在运行时说话。推理时动作由主策略决定,CHR 不以任何形式介入动作选择。它的作用发生在训练中,以改变共享表征的方式生效——等训练结束,它留下的是模型看局面的方式,而不是一个可调用的裁判

CHR 还有一个副作用:它让模型内部变得更容易被观察。因为每一个决策都同时落在"动作族 / 上下文 / 意图 / 后见事实"几组坐标上,训练者可以回过头来观察某一类局面里哪些意图被反复调用、哪些结果更稳定、哪些决策族出现了异常偏移。这不是给模型塞进人类规则,而是给人一个看模型怎么想的窗口。

一句话:CHR 让神经网络在训练中沉淀经验,但既不把经验变成奖励,也不把经验变成动作。它改变的是模型"怎么理解世界",不是"该选什么动作"

五、在线阶段:混合型自对弈,不走单一极端

仅有离线基座还不够。一个真正能打的模型,需要在自对弈里继续成长。但如何增强,本身也是一个哲学问题。

当前业界在线增强主要有两种思路:

  • 纯结果导向的 PPO:把对局最终收益或某种学习出来的期望顺位回溯当作优势信号,对策略分布做放大 / 抑制。它简单、通用,但依然继承了"结果加权"那套信号噪声和投机诱导的问题
  • 纯反事实遗憾导向:沿着反事实遗憾的方向持续收敛策略。它理论上更优雅,但前面说过,在麻将里投入代价过高,并且在实战分布上未必最优

FlyA 在线阶段的姿态是混合、克制、不走极端

它同时借用了 PPO 的工程稳定性和反事实遗憾路径那种"在相似上下文里比较不同选择的优劣"的思路,但两者都不作为单一信号源——前者的结果信号会被削弱并限制作用范围,后者的遗憾类比会被 CHR 以结构化方式承载。再加上离线训练里已经打下的辅助头与表征几何,在线增强的作用面从"直接改动作"被压低到"微调策略分布",在这个更窄的作用面上实现提升。

出于工程与策略上的考虑,这一层的具体组合方式和各部分的权重本档不展开。关键立场是:在线增强不是对"模型应该赢"的压力放大,而是让模型在更多真实对手和更多真实上下文里,继续长出它在离线阶段已经开始长出的那些结构

六、让神经网络长到超越人类

把前面几件事放一起,FlyA 的设计路径就清晰了:

  • 不走纯粹的反事实遗憾最小化——前期进步过慢、稳态后风格容易固化、面对弱对手过度保守
  • 也不走纯粹结果导向的强化——信号噪声大,会诱导投机,长期压天花板
  • 主策略严格约束在人类动作学习上——保持诚实,避免被噪声污染
  • 用规则事实层提供完整的世界输入——模型在统一事实上自己做价值判断
  • 用辅助头引导"该想什么"——把维度塞进表征,不塞进动作
  • 用 CHR 沉淀后见事实经验——改变模型看局面的方式,不当奖励,不当裁判
  • 用非单一极端的混合型自对弈做在线增强——作用面有限,节奏克制

这七点放在一起,指向同一件事:给神经网络一个足够大、但不被代替思考的空间,让它自己长到有可能超越人类的地方

FlyA 没有选最容易让模型"打得好"的路径。它选的是最有可能让模型长得超过人类的路径。这是一种更慢、更需要耐心、也更需要克制自己"不走捷径"的选择。但它留下了空间——让神经网络长出它本来可以拥有的策略,而不是被迫在人类或启发式预设的框架里把棋打得漂亮。

一句话总结

FlyA 的设计哲学是:离线阶段严格用纯行为学习打基座,用辅助头和基于上下文的后见事实记账做隐式塑形,绝不做显式的结果导向加权;在线阶段走一条既不完全结果导向、也不完全遗憾导向的混合自对弈增强路径。用这套组合,在不依赖巨大集群、也不牺牲理解深度的前提下,让神经网络有机会长出超越人类的麻将策略。


切换语言: 繁體中文 · English · 日本語

AIMahjongCoach AIMahjongCoach

© 2026 AIMahjongCoach. All rights reserved.

1m2m3m